package com.dotmedia.dboperations;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import com.dotmedia.core.DatabaseAccessService;
import com.dotmedia.entities.Mediatype;

/**
 * This class is to deal with the database operations of the entity Mediatype
 * 
 * @author siddharthsaha
 * 
 */
public class MediatypeDatabaseOperations {

	private static Logger logger = Logger.getLogger("dboperations");

	public void persistMediatypeEntity(Mediatype mediatypeEntity) {
		logger.info("IN method persistMediatypeEntity() in MediatypeDatabaseOperations");
		DatabaseAccessService databaseAccessService = DatabaseAccessService.getInstance();
		int persistStatus = databaseAccessService.persistEntity(mediatypeEntity);
		if (persistStatus == 0) {
			logger.info("Persisting the Mediatype entity with id: " + mediatypeEntity.getMediatypeId() + " was successful");
		} else {
			logger.error("Persisting the Mediatype entity with id: " + mediatypeEntity.getMediatypeId() + " was not successful");
		}
		logger.info("OUT method persistMediatypeEntity() in MediatypeDatabaseOperations");
	}

	public void removeMediatypeEntity(Mediatype mediatypeEntity) {
		logger.info("IN method removeMediatypeEntity() in MediatypeDatabaseOperations");
		logger.info("Removing a Mediatype entity with id: " + mediatypeEntity.getMediatypeId());
		DatabaseAccessService databaseAccessService = DatabaseAccessService.getInstance();
		int removeStatus = databaseAccessService.removeEntity(mediatypeEntity, mediatypeEntity.getMediatypeId().intValue());
		if (removeStatus == 0) {
			logger.info("Removal of the mediatype entity from the database was successful");
		} else {
			logger.error("Removal of the mediatype entity from the database was not successful");
		}
		logger.info("OUT method removeMediatypeEntity() in MediatypeDatabaseOperation");
	}

	public void updateMediatypeEntity(Mediatype mediatypeEntity) {
		logger.info("IN method updateMediatypeEntity() in MediatypeDatabaseOperations");
		String query = "SELECT mediatypeEntity FROM Mediatype mediatypeEntity WHERE mediatypeEntity.system.id = "
				+ mediatypeEntity.getSystem().getId() + " AND mediatypeEntity.mediatypeRefCode = '" + mediatypeEntity.getMediatypeRefCode() + "'";
		logger.info("Query: " + query);
		DatabaseAccessService databaseAccessService = DatabaseAccessService.getInstance();
		List retreivedEntities = databaseAccessService.getEntities(query);
		boolean updated = false;
		for (int index = 0; index < retreivedEntities.size(); index++) {
			Mediatype currentMediatype = (Mediatype) retreivedEntities.get(index);
			if (currentMediatype.getSystem().getId().intValue() == mediatypeEntity.getSystem().getId().intValue()
					&& currentMediatype.getMediatypeRefCode().equals(mediatypeEntity.getMediatypeRefCode())) {
				logger.info("Obtained the Mediatype entity to be updated");
				currentMediatype.setDescription(mediatypeEntity.getDescription());
				int updateStatus = databaseAccessService.updateEntity(currentMediatype);
				if (updateStatus == 0) {
					updated = true;
				}
				break;
			}
		}
		if (updated) {
			logger.info("The mediatype entity was successfully updated");
		} else {
			logger.error("There was an error in updating the mediatype entity");
		}
		logger.info("OUT method updateMediartypeEntity() in MediatypeDatabaseOperations");
	}

	public List<Mediatype> getAllMediatypeEntities() {
		logger.info("IN method getAllMediatypeEntities() in MediatypeDatabaseOperations");
		List<Mediatype> toReturnList = new ArrayList<Mediatype>();
		String query = "SELECT mediatypeEntity FROM Mediatype mediatypeEntity";
		logger.info("Query: " + query);
		DatabaseAccessService databaseAccessService = DatabaseAccessService.getInstance();
		List retrievedEntities = databaseAccessService.getEntities(query);
		for (int index = 0; index < retrievedEntities.size(); index++) {
			Mediatype currentMediatypeEntity = (Mediatype) retrievedEntities.get(index);
			toReturnList.add(currentMediatypeEntity);
		}
		logger.info("OUT method getAllMediatypeEntities() in MediatypeDatabaseOperations");
		return toReturnList;
	}

	public List<Mediatype> getMediatypeEntitiesByMediatypeId(int mediatypeId) {
		logger.info("IN method getMediatypeEntitiesByMediatypeId() in MediatypeDatabaseOperations");
		List<Mediatype> toReturnList = new ArrayList<Mediatype>();
		String query = "SELECT mediatypeEntity FROM Mediatype mediatypeEntity WHERE mediatypeEntity.mediatypeId = " + mediatypeId;
		logger.info("Query: " + query);
		DatabaseAccessService databaseAccessService = DatabaseAccessService.getInstance();
		List retrievedEntities = databaseAccessService.getEntities(query);
		for (int index = 0; index < retrievedEntities.size(); index++) {
			Mediatype currentMediatypeEntity = (Mediatype) retrievedEntities.get(index);
			if (currentMediatypeEntity.getMediatypeId().intValue() == mediatypeId) {
				toReturnList.add(currentMediatypeEntity);
			}
		}
		logger.info("OUT method getMediatypeEntitiesByMediatypeId() in MediatypeDatabaseOperations");
		return toReturnList;
	}

	public List<Mediatype> getMediatypeEntitiesByMediatypeRefCode(String mediatypeRefCode) {
		logger.info("IN method getMediatypeEntitiesByMediatypeRefCode() in MediatypeDatabaseOperations");
		List<Mediatype> toReturnList = new ArrayList<Mediatype>();
		String query = "SELECT mediatypeEntity FROM Mediatype mediatypeEntity WHERE mediatypeEntity.mediatypeRefCode = '" + mediatypeRefCode + "'";
		logger.info("Query: " + query);
		DatabaseAccessService databaseAccessService = DatabaseAccessService.getInstance();
		List retrivedEntities = databaseAccessService.getEntities(query);
		for (int index = 0; index < retrivedEntities.size(); index++) {
			Mediatype currentMediatypeEntity = (Mediatype) retrivedEntities.get(index);
			if (currentMediatypeEntity.getMediatypeRefCode().equals(mediatypeRefCode)) {
				toReturnList.add(currentMediatypeEntity);
			}
		}
		logger.info("OUT method getMediatypeEntitiesByMediatypeRefCode() in MediatypeDatabaseOperations");
		return toReturnList;
	}
	
}
